register linear reference functions
authorØyvind Kolås <ok@src.gnome.org>
Sun, 18 Sep 2005 21:02:22 +0000 (21:02 +0000)
committerØyvind Kolås <ok@src.gnome.org>
Sun, 18 Sep 2005 21:02:22 +0000 (21:02 +0000)
babl/base/model-cmyk.c
babl/base/model-gray.c
babl/base/model-rgb.c
babl/base/model-ycbcr.c
extensions/CIE-Lab.c
extensions/naive-CMYK.c

index 85df0685cc4040db425df63edb095285c332bdb1..a4fbdc1d158b42b89c739b11292263b7fd307121 100644 (file)
@@ -96,21 +96,15 @@ models (void)
 }
 
 static long
-rgb_to_cmyk (int    src_bands,
-             void **src,
-             int   *src_pitch,
-             int    dst_bands,
-             void **dst,
-             int   *dst_pitch,
+rgb_to_cmyk (void *src,
+             void *dst,
              long   n)
 {
-  BABL_PLANAR_SANITY
-
   while (n--)
     {
-      double red   = *(double*)src[0];
-      double green = *(double*)src[1];
-      double blue  = *(double*)src[2];
+      double red   = ((double*)src)[0];
+      double green = ((double*)src)[1];
+      double blue  = ((double*)src)[2];
 
       double cyan, magenta, yellow, key;
 
@@ -140,36 +134,28 @@ rgb_to_cmyk (int    src_bands,
           yellow  = 0.0;
         }
 
-      *(double*)dst[0] = cyan;
-      *(double*)dst[1] = magenta;
-      *(double*)dst[2] = yellow;
-      *(double*)dst[3] = key;
-
-      if (dst_bands > 4)               /* alpha passthorugh */
-        *(double*)dst[4] = (src_bands>3)?*(double*)src[3]:1.0;
+      ((double*)dst)[0] = cyan;
+      ((double*)dst)[1] = magenta;
+      ((double*)dst)[2] = yellow;
+      ((double*)dst)[3] = key;
 
-      BABL_PLANAR_STEP
+      src+=4*sizeof(double);
+      dst+=4*sizeof(double)
     }
   return n;
 }
 
 static long 
-cmyk_to_rgb (int    src_bands,
-             void **src,
-             int   *src_pitch,
-             int    dst_bands,
-             void **dst,
-             int   *dst_pitch,
-             long   n)
+cmyk_to_rgb (void *src,
+             void *dst,
+             long  n)
 {
-  BABL_PLANAR_SANITY
-
   while (n--)
     {
-      double cyan    = *(double*)src[0];
-      double yellow  = *(double*)src[1];
-      double magenta = *(double*)src[2];
-      double key     = *(double*)src[3];
+      double cyan    = ((double*)src)[0];
+      double yellow  = ((double*)src)[1];
+      double magenta = ((double*)src)[2];
+      double key     = ((double*)src)[3];
 
       double red, green, blue;
 
@@ -188,67 +174,35 @@ cmyk_to_rgb (int    src_bands,
       green = 1.0 - magenta;
       blue  = 1.0 - yellow;
 
-      *(double*)dst[0] = red;
-      *(double*)dst[1] = green;
-      *(double*)dst[2] = blue;
+      ((double*)dst)[0] = red;
+      ((double*)dst)[1] = green;
+      ((double*)dst)[2] = blue;
 
-      if (dst_bands > 3)               /* alpha passthorugh */
-        *(double*)dst[3] = (src_bands>4)?*(double*)src[4]:1.0;
+      ((double*)dst)[3] = 1.0;
 
-      BABL_PLANAR_STEP
+      src+=4*sizeof(double);
+      dst+=4*sizeof(double)
     }
   return n;
 }
 
-#if 0
-static long
-rgb_to_and_from_cmy (int    src_bands,
-                     void **src,
-                     int   *src_pitch,
-                     int    dst_bands,
-                     void **dst,
-                     int   *dst_pitch,
-                     long   n)
-{
-  BABL_PLANAR_SANITY
-
-  while (n--)
-    {
-      int band;
-      for (band=0; band< 3; band++)
-        {
-          *(double*)dst[band] = 1.0F- (*(double*) src[band]);
-        }
-      for (;band<dst_bands && band<src_bands;band++)
-        {
-          *(double*)dst[band] = *(double*) src[band];
-        }
-      for (;band<dst_bands;band++)
-        {
-          *(double*)dst[band] = 1.0;  /* alpha */
-        }
-      BABL_PLANAR_STEP
-    }
-}
-#endif
-
 static void
 conversions (void)
 {
   babl_conversion_new (
-    "babl-base: rgba to cmy",
+    "babl-base: rgba to cmyk",
     "source",      babl_model_id (BABL_RGBA),
     "destination", babl_model_id (BABL_CMYK),
-    "planar",      rgb_to_cmyk,
+    "linear",      rgb_to_cmyk,
     NULL
   );
 
 
   babl_conversion_new (
-    "babl-base: cmy to rgba",
+    "babl-base: cmyk to rgba",
     "source",      babl_model_id (BABL_CMYK),
     "destination", babl_model_id (BABL_RGBA),
-    "planar",      cmyk_to_rgb,
+    "linear",      cmyk_to_rgb,
     NULL
   );
 }
@@ -257,4 +211,3 @@ static void
 formats (void)
 {
 }
-
index 979f3b71d41e5dffa5be47ea7e30c48eef6bbbb7..37044cfcde533a16bf668551cea07fdbf31f2d94 100644 (file)
@@ -92,37 +92,56 @@ models (void)
 
 
 static long
-rgb_to_gray (int    src_bands,
-             void **src,
-             int   *src_pitch,
-             int    dst_bands,
-             void **dst,
-             int   *dst_pitch,
-             long   n)
+rgba_to_graya (void *src,
+               void *dst,
+               long   n)
 {
-  BABL_PLANAR_SANITY
   while (n--)
     {
       double red, green, blue;
       double luminance, alpha;
 
-      red   = *(double *)src[0];
-      green = *(double *)src[1];
-      blue  = *(double *)src[2];
-      if (src_bands>3)
-        alpha = *(double *)src[3];
-      else
-        alpha = 1.0;
+      red   = ((double *)src)[0];
+      green = ((double *)src)[1];
+      blue  = ((double *)src)[2];
+      alpha = ((double *)src)[3];
 
       luminance  = red   * RGB_LUMINANCE_RED +
                    green * RGB_LUMINANCE_GREEN +
                    blue  * RGB_LUMINANCE_BLUE;
-      *(double*)dst[0] = luminance;
 
-      if (dst_bands==2)
-        *(double*)dst[1] = alpha;
+      ((double*)dst)[0] = luminance;
+      ((double*)dst)[1] = alpha;
 
-      BABL_PLANAR_STEP
+      src += sizeof (double) * 4;
+      dst += sizeof (double) * 2;
+    }
+  return n;
+}
+
+static long
+rgba_to_gray (void *src,
+              void *dst,
+              long   n)
+{
+  while (n--)
+    {
+      double red, green, blue;
+      double luminance, alpha;
+
+      red   = ((double *)src)[0];
+      green = ((double *)src)[1];
+      blue  = ((double *)src)[2];
+      alpha = ((double *)src)[3];
+
+      luminance  = red   * RGB_LUMINANCE_RED +
+                   green * RGB_LUMINANCE_GREEN +
+                   blue  * RGB_LUMINANCE_BLUE;
+
+      ((double*)dst)[0] = luminance;
+
+      src += sizeof (double) * 4;
+      dst += sizeof (double) * 1;
     }
   return n;
 }
@@ -205,38 +224,56 @@ gray_2_2_to_rgb (int    src_bands,
 
 
 static long
-gray_to_rgb (int    src_bands,
-             void **src,
-             int   *src_pitch,
-             int    dst_bands,
-             void **dst,
-             int   *dst_pitch,
-             long   n)
+graya_to_rgba (void *src,
+               void *dst,
+               long  n)
 {
-  BABL_PLANAR_SANITY
   while (n--)
     {
       double luminance;
       double red, green, blue;
       double alpha;
 
-      luminance = *(double *)src[0];
+      luminance = ((double *)src)[0];
+      alpha     = ((double *)src)[1];
       red       = luminance;
       green     = luminance;
       blue      = luminance;
-      if (src_bands > 1)
-        alpha = *(double *)src[1];
-      else
-        alpha     = 1.0;
 
-      *(double*)dst[0] = red;
-      *(double*)dst[1] = green;
-      *(double*)dst[2] = blue;
+      ((double*)dst)[0] = red;
+      ((double*)dst)[1] = green;
+      ((double*)dst)[2] = blue;
+      ((double*)dst)[3] = alpha;
 
-      if (dst_bands>3)
-        *(double*)dst[3] = alpha;
+      src += sizeof(double)*2;
+      dst += sizeof(double)*4;
+    }
+  return n;
+}
 
-      BABL_PLANAR_STEP
+
+static long
+gray_to_rgba (void *src,
+              void *dst,
+              long  n)
+{
+  while (n--)
+    {
+      double luminance;
+      double red, green, blue;
+
+      luminance = ((double *)src)[0];
+      red       = luminance;
+      green     = luminance;
+      blue      = luminance;
+
+      ((double*)dst)[0] = red;
+      ((double*)dst)[1] = green;
+      ((double*)dst)[2] = blue;
+      ((double*)dst)[3] = 1.0;
+
+      src += sizeof(double)*1;
+      dst += sizeof(double)*4;
     }
   return n;
 }
@@ -409,56 +446,28 @@ conversions (void)
   babl_conversion_new (
     babl_model_id (BABL_GRAY),
     babl_model_id (BABL_RGBA),
-    "planar",      gray_to_rgb,
-    NULL
-  );
-
-  babl_conversion_new (
-    babl_model_id (BABL_GRAY),
-    babl_model_id (BABL_RGB),
-    "planar",      gray_to_rgb,
+    "linear",      gray_to_rgba,
     NULL
   );
 
   babl_conversion_new (
     babl_model_id (BABL_GRAY_ALPHA),
     babl_model_id (BABL_RGBA),
-    "planar",      gray_to_rgb,
-    NULL
-  );
-
-  babl_conversion_new (
-    babl_model_id (BABL_GRAY_ALPHA),
-    babl_model_id (BABL_RGB),
-    "planar",      gray_to_rgb,
+    "linear",      graya_to_rgba,
     NULL
   );
 
   babl_conversion_new (
     babl_model_id (BABL_RGBA),
     babl_model_id (BABL_GRAY_ALPHA),
-    "planar",      rgb_to_gray,
+    "linear",      rgba_to_graya,
     NULL
   );
 
   babl_conversion_new (
     babl_model_id (BABL_RGBA),
     babl_model_id (BABL_GRAY),
-    "planar",      rgb_to_gray,
-    NULL
-  );
-
-  babl_conversion_new (
-    babl_model_id (BABL_RGB),
-    babl_model_id (BABL_GRAY_ALPHA),
-    "planar",      rgb_to_gray,
-    NULL
-  );
-
-  babl_conversion_new (
-    babl_model_id (BABL_RGB),
-    babl_model_id (BABL_GRAY),
-    "planar",      rgb_to_gray,
+    "linear",      rgba_to_gray,
     NULL
   );
 
index 73ecfe908d2272660bb3157741ea688ca6a43ba0..e64a86f194189438cda887086b5deee23bd9c20c 100644 (file)
@@ -368,16 +368,6 @@ formats (void)
     babl_component_id (BABL_ALPHA),
     NULL);
 
-  babl_format_new (
-    "id",              BABL_RGBA_DOUBLE,
-    babl_model_id     (BABL_RGBA),
-    babl_type_id      (BABL_DOUBLE),
-    babl_component_id (BABL_RED), 
-    babl_component_id (BABL_GREEN), 
-    babl_component_id (BABL_BLUE),
-    babl_component_id (BABL_ALPHA),
-    NULL);
-
   babl_format_new (
     "id", BABL_RGB_FLOAT,
     babl_model_id     (BABL_RGB),
index 6a3e2aa6df73628ef892bbbafd32ef755d0582e4..000f32d147acd9169f4826498b1006b71baf4ab9 100644 (file)
@@ -75,21 +75,16 @@ models (void)
 }
 
 static long
-rgb_to_ycbcr (int    src_bands,
-              void **src,
-              int   *src_pitch,
-              int    dst_bands,
-              void **dst,
-              int   *dst_pitch,
-              long   n)
+rgba_to_ycbcra (void *src,
+                void *dst,
+                long  n)
 {
-  BABL_PLANAR_SANITY
-
   while (n--)
     {
-      double red   = *(double*)src[0];
-      double green = *(double*)src[1];
-      double blue  = *(double*)src[2];
+      double red   = ((double*)src)[0];
+      double green = ((double*)src)[1];
+      double blue  = ((double*)src)[2];
+      double alpha = ((double*)src)[3];
 
       double luminance, cb, cr;
 
@@ -101,34 +96,60 @@ rgb_to_ycbcr (int    src_bands,
       cb        = -0.168736 * red  -0.331264 * green  +0.5      * blue;
       cr        =  0.5      * red  -0.418688 * green  -0.081312 * blue;
 
-      *(double*)dst[0] = luminance;
-      *(double*)dst[1] = cb;
-      *(double*)dst[2] = cr;
-
-      if (dst_bands > 3)               /* alpha passthorugh */
-        *(double*)dst[3] = (src_bands>3)?*(double*)src[3]:1.0;
+      ((double*)dst)[0] = luminance;
+      ((double*)dst)[1] = cb;
+      ((double*)dst)[2] = cr;
+      ((double*)dst)[3] = alpha;
 
-      BABL_PLANAR_STEP
+      src += sizeof (double) * 4;
+      dst += sizeof (double) * 4;
     }
   return n;
 }
 
+
 static long
-ycbcr_to_rgb (int    src_bands,
-              void **src,
-              int   *src_pitch,
-              int    dst_bands,
-              void **dst,
-              int   *dst_pitch,
-              long   n)
+rgba_to_ycbcr (void *src,
+               void *dst,
+               long  n)
 {
-  BABL_PLANAR_SANITY
+  while (n--)
+    {
+      double red   = ((double*)src)[0];
+      double green = ((double*)src)[1];
+      double blue  = ((double*)src)[2];
+
+      double luminance, cb, cr;
+
+      red   = linear_to_gamma_2_2 (red);
+      green = linear_to_gamma_2_2 (green);
+      blue  = linear_to_gamma_2_2 (blue);
+      
+      luminance =  0.299    * red  +0.587    * green  +0.114    * blue;
+      cb        = -0.168736 * red  -0.331264 * green  +0.5      * blue;
+      cr        =  0.5      * red  -0.418688 * green  -0.081312 * blue;
+
+      ((double*)dst)[0] = luminance;
+      ((double*)dst)[1] = cb;
+      ((double*)dst)[2] = cr;
+
+      src += sizeof (double) * 4;
+      dst += sizeof (double) * 3;
+    }
+  return n;
+}
 
+static long
+ycbcra_to_rgba (void *src,
+                void *dst,
+                long  n)
+{
   while (n--)
     {
-      double luminance = *(double*)src[0];
-      double cb        = *(double*)src[1];
-      double cr        = *(double*)src[2];
+      double luminance = ((double*)src)[0];
+      double cb        = ((double*)src)[1];
+      double cr        = ((double*)src)[2];
+      double alpha     = ((double*)src)[3];
 
       double red, green, blue;
 
@@ -140,14 +161,46 @@ ycbcr_to_rgb (int    src_bands,
       green = gamma_2_2_to_linear (green);
       blue  = gamma_2_2_to_linear (blue);
 
-      *(double*)dst[0] = red;
-      *(double*)dst[1] = green;
-      *(double*)dst[2] = blue;
+      ((double*)dst)[0] = red;
+      ((double*)dst)[1] = green;
+      ((double*)dst)[2] = blue;
+      ((double*)dst)[3] = alpha;
+
+      src += sizeof (double) * 4;
+      dst += sizeof (double) * 4;
+    }
+  return n;
+}
 
-      if (dst_bands > 3)               /* alpha passthorugh */
-        *(double*)dst[3] = (src_bands>3)?*(double*)src[3]:1.0;
 
-      BABL_PLANAR_STEP
+static long
+ycbcr_to_rgba (void *src,
+               void *dst,
+               long  n)
+{
+  while (n--)
+    {
+      double luminance = ((double*)src)[0];
+      double cb        = ((double*)src)[1];
+      double cr        = ((double*)src)[2];
+
+      double red, green, blue;
+
+      red   = 1.0 * luminance  + 0.0      * cb  + 1.40200    * cr;
+      green = 1.0 * luminance  - 0.344136 * cb  - 0.71414136 * cr;
+      blue  = 1.0 * luminance  + 1.772    * cb  + 0.0        * cr;
+
+      red   = gamma_2_2_to_linear (red);
+      green = gamma_2_2_to_linear (green);
+      blue  = gamma_2_2_to_linear (blue);
+
+      ((double*)dst)[0] = red;
+      ((double*)dst)[1] = green;
+      ((double*)dst)[2] = blue;
+      ((double*)dst)[3] = 1.0;
+
+      src += sizeof (double) * 3;
+      dst += sizeof (double) * 4;
     }
   return n;
 }
@@ -158,37 +211,25 @@ conversions (void)
   babl_conversion_new (
     babl_model_id (BABL_RGBA),
     babl_model_id (BABL_YCBCR),
-    "planar",      rgb_to_ycbcr,
+    "linear",      rgba_to_ycbcr,
     NULL
   );
   babl_conversion_new (
     babl_model_id (BABL_YCBCR),
     babl_model_id (BABL_RGBA),
-    "planar",      ycbcr_to_rgb,
-    NULL
-  );
-  babl_conversion_new (
-    babl_model_id (BABL_RGB),
-    babl_model_id (BABL_YCBCR),
-    "planar",      rgb_to_ycbcr,
-    NULL
-  );
-  babl_conversion_new (
-    babl_model_id (BABL_YCBCR),
-    babl_model_id (BABL_RGB),
-    "planar",      ycbcr_to_rgb,
+    "linear",      ycbcr_to_rgba,
     NULL
   );
   babl_conversion_new (
     babl_model_id (BABL_RGBA),
     babl_model_id (BABL_YCBCR_ALPHA),
-    "planar",      rgb_to_ycbcr,
+    "linear",      rgba_to_ycbcra,
     NULL
   );
   babl_conversion_new (
     babl_model_id (BABL_YCBCR_ALPHA),
     babl_model_id (BABL_RGBA),
-    "planar",      ycbcr_to_rgb,
+    "linear",      ycbcra_to_rgba,
     NULL
   );
 }
@@ -196,9 +237,8 @@ conversions (void)
 static void
 formats (void)
 {
-
   babl_format_new (
-    "name",        "Y'CbCr u8 4:4:4",
+    "name",        "Y'CbCr u8",
     "id",          BABL_YCBCR420,
     "planar",
     babl_model_id  (BABL_YCBCR),
index ae5672134eec88605c7bfe7705815ba93eaae36a..6cbbefc2d0a3f3ec85434d0a7418855f901e5c9f 100644 (file)
@@ -143,67 +143,107 @@ cpercep_distance_space (const double L1, const double a1, const double b1,
 
 
 static long
-rgb_to_lab (int    src_bands,
-            void **src,
-            int   *src_pitch,
-            int    dst_bands,
-            void **dst,
-            int   *dst_pitch,
-            long   n)
+rgba_to_lab (void *src,
+             void *dst,
+             long  n)
 {
-  BABL_PLANAR_SANITY
-
   while (n--)
     {
-      double red   = *(double*)src[0];
-      double green = *(double*)src[1];
-      double blue  = *(double*)src[2];
+      double red   = ((double*)src)[0];
+      double green = ((double*)src)[1];
+      double blue  = ((double*)src)[2];
 
       double L, a, b;
 
       cpercep_rgb_to_space (red, green, blue, &L, &a, &b);
 
-      *(double*)dst[0] = L;
-      *(double*)dst[1] = a;
-      *(double*)dst[2] = b;
+      ((double*)dst)[0] = L;
+      ((double*)dst)[1] = a;
+      ((double*)dst)[2] = b;
+
+      src += sizeof(double) * 4;
+      dst += sizeof(double) * 3;
+    }
+  return n;
+}
 
-      if (dst_bands > 3)               /* alpha passthorugh */
-        *(double*)dst[3] = (src_bands>3)?*(double*)src[3]:1.0;
+static long
+lab_to_rgba (void *src,
+             void *dst,
+             long  n)
+{
+  while (n--)
+    {
+      double L = ((double*)src)[0];
+      double a = ((double*)src)[1];
+      double b = ((double*)src)[2];
 
-      BABL_PLANAR_STEP
+      double red, green, blue;
+
+      cpercep_space_to_rgb (L, a, b, &red, &green, &blue);
+
+      ((double*)dst)[0] = red;
+      ((double*)dst)[1] = green;
+      ((double*)dst)[2] = blue;
+      ((double*)dst)[3] = 1.0;
+
+      src += sizeof(double) * 3;
+      dst += sizeof(double) * 4;
     }
   return n;
 }
 
+
 static long
-lab_to_rgb (int    src_bands,
-            void **src,
-            int   *src_pitch,
-            int    dst_bands,
-            void **dst,
-            int   *dst_pitch,
-            long   n)
+rgba_to_laba (void *src,
+              void *dst,
+              long  n)
 {
-  BABL_PLANAR_SANITY
+  while (n--)
+    {
+      double red   = ((double*)src)[0];
+      double green = ((double*)src)[1];
+      double blue  = ((double*)src)[2];
+      double alpha = ((double*)src)[3];
+
+      double L, a, b;
 
+      cpercep_rgb_to_space (red, green, blue, &L, &a, &b);
+
+      ((double*)dst)[0] = L;
+      ((double*)dst)[1] = a;
+      ((double*)dst)[2] = b;
+      ((double*)dst)[3] = alpha;
+
+      src += sizeof(double) * 4;
+      dst += sizeof(double) * 4;
+    }
+  return n;
+}
+
+static long
+laba_to_rgba (void *src,
+              void *dst,
+              long  n)
+{
   while (n--)
     {
-      double L = *(double*)src[0];
-      double a = *(double*)src[1];
-      double b = *(double*)src[2];
+      double L     = ((double*)src)[0];
+      double a     = ((double*)src)[1];
+      double b     = ((double*)src)[2];
+      double alpha = ((double*)src)[3];
 
       double red, green, blue;
 
       cpercep_space_to_rgb (L, a, b, &red, &green, &blue);
 
-      *(double*)dst[0] = red;
-      *(double*)dst[1] = green;
-      *(double*)dst[2] = blue;
+      ((double*)dst)[0] = red;
+      ((double*)dst)[1] = green;
+      ((double*)dst)[2] = blue;
+      ((double*)dst)[3] = alpha;
 
-      if (dst_bands > 3)               /* alpha passthorugh */
-        *(double*)dst[3] = (src_bands>3)?*(double*)src[3]:1.0;
-
-      BABL_PLANAR_STEP
+      src += sizeof(double) * 4;
+      dst += sizeof(double) * 4;
     }
   return n;
 }
@@ -215,37 +255,25 @@ conversions (void)
   babl_conversion_new (
     babl_model ("RGBA"),
     babl_model ("CIE Lab"),
-    "planar",      rgb_to_lab,
+    "linear",      rgba_to_lab,
     NULL
   );
   babl_conversion_new (
     babl_model ("CIE Lab"),
     babl_model ("RGBA"),
-    "planar",      lab_to_rgb,
-    NULL
-  );
-  babl_conversion_new (
-    babl_model ("RGB"),
-    babl_model ("CIE Lab"),
-    "planar",      rgb_to_lab,
-    NULL
-  );
-  babl_conversion_new (
-    babl_model ("CIE Lab"),
-    babl_model ("RGB"),
-    "planar",      lab_to_rgb,
+    "linear",      lab_to_rgba,
     NULL
   );
   babl_conversion_new (
     babl_model ("RGBA"),
     babl_model ("CIE Lab alpha"),
-    "planar",      rgb_to_lab,
+    "linear",      rgba_to_laba,
     NULL
   );
   babl_conversion_new (
     babl_model ("CIE Lab alpha"),
     babl_model ("RGBA"),
-    "planar",      lab_to_rgb,
+    "linear",      laba_to_rgba,
     NULL
   );
 
index 7badb0df20431af630471c5f44c9f2bc2a131b24..0b5478bfcec548d89400443014251e9dfcbaf92d 100644 (file)
 #include "babl.h"
 #include "util.h"
 
-static long rgb_to_cmyk (int    src_bands,
-                         void **src,
-                         int   *src_pitch,
-                         int    dst_bands,
-                         void **dst,
-                         int   *dst_pitch,
-                         long   n);
-static long cmyk_to_rgb (int    src_bands,
-                         void **src,
-                         int   *src_pitch,
-                         int    dst_bands,
-                         void **dst,
-                         int   *dst_pitch,
-                         long   n);
+static long
+rgba_to_cmyk (void *src,
+              void *dst,
+              long   n);
+
+static long 
+cmyk_to_rgba (void *src,
+              void *dst,
+              long  n);
+
 int
 init (void)
 {
@@ -55,45 +51,19 @@ init (void)
     NULL
   );
 
-  babl_model_new (
-    "name", "CMYKA",
-    babl_component ("cyan"),
-    babl_component ("magenta"),
-    babl_component ("yellow"),
-    babl_component ("key"),
-    babl_component ("A"),
-    NULL
-  );
-
   babl_conversion_new (
     babl_model ("RGBA"),
     babl_model ("CMYK"),
-    "planar",      rgb_to_cmyk,
+    "linear",      rgba_to_cmyk,
     NULL
   );
 
   babl_conversion_new (
     babl_model ("CMYK"),
     babl_model ("RGBA"),
-    "planar",      cmyk_to_rgb,
-    NULL
-  );
-
-
-  babl_conversion_new (
-    babl_model ("RGBA"),
-    babl_model ("CMYKA"),
-    "planar",      rgb_to_cmyk,
-    NULL
-  );
-
-  babl_conversion_new (
-    babl_model ("CMYKA"),
-    babl_model ("RGBA"),
-    "planar",      cmyk_to_rgb,
+    "linear",      cmyk_to_rgba,
     NULL
   );
-
   babl_format_new (
       "name",        "CMYK float",
       babl_model     ("CMYK"),
@@ -108,26 +78,21 @@ init (void)
   return 0;
 }
 
+
 static long
-rgb_to_cmyk (int    src_bands,
-             void **src,
-             int   *src_pitch,
-             int    dst_bands,
-             void **dst,
-             int   *dst_pitch,
-             long   n)
+rgba_to_cmyk (void *src,
+              void *dst,
+              long   n)
 {
-  BABL_PLANAR_SANITY
-
   while (n--)
     {
-      double red   = *(double*)src[0];
-      double green = *(double*)src[1];
-      double blue  = *(double*)src[2];
+      double red   = ((double*)src)[0];
+      double green = ((double*)src)[1];
+      double blue  = ((double*)src)[2];
 
       double cyan, magenta, yellow, key;
 
-      double pullout = 0.8;
+      double pullout = 1.0;
 
       cyan    = 1.0 - red;
       magenta = 1.0 - green;
@@ -153,36 +118,28 @@ rgb_to_cmyk (int    src_bands,
           yellow  = 0.0;
         }
 
-      *(double*)dst[0] = cyan;
-      *(double*)dst[1] = magenta;
-      *(double*)dst[2] = yellow;
-      *(double*)dst[3] = key;
+      ((double*)dst)[0] = cyan;
+      ((double*)dst)[1] = magenta;
+      ((double*)dst)[2] = yellow;
+      ((double*)dst)[3] = key;
 
-      if (dst_bands > 4)               /* alpha passthorugh */
-        *(double*)dst[4] = (src_bands>3)?*(double*)src[3]:1.0;
-
-      BABL_PLANAR_STEP
+      src+=4*sizeof(double);
+      dst+=4*sizeof(double);
     }
   return n;
 }
 
-static long
-cmyk_to_rgb (int    src_bands,
-             void **src,
-             int   *src_pitch,
-             int    dst_bands,
-             void **dst,
-             int   *dst_pitch,
-             long   n)
+static long 
+cmyk_to_rgba (void *src,
+              void *dst,
+              long  n)
 {
-  BABL_PLANAR_SANITY
-
   while (n--)
     {
-      double cyan    = *(double*)src[0];
-      double magenta = *(double*)src[1];
-      double yellow  = *(double*)src[2];
-      double key     = *(double*)src[3];
+      double cyan    = ((double*)src)[0];
+      double magenta = ((double*)src)[1];
+      double yellow  = ((double*)src)[2];
+      double key     = ((double*)src)[3];
 
       double red, green, blue;
 
@@ -201,14 +158,14 @@ cmyk_to_rgb (int    src_bands,
       green = 1.0 - magenta;
       blue  = 1.0 - yellow;
 
-      *(double*)dst[0] = red;
-      *(double*)dst[1] = green;
-      *(double*)dst[2] = blue;
+      ((double*)dst)[0] = red;
+      ((double*)dst)[1] = green;
+      ((double*)dst)[2] = blue;
 
-      if (dst_bands > 3)               /* alpha passthorugh */
-        *(double*)dst[3] = (src_bands>4)?*(double*)src[4]:1.0;
+      ((double*)dst)[3] = 1.0;
 
-      BABL_PLANAR_STEP
+      src+=4*sizeof(double);
+      dst+=4*sizeof(double);
     }
   return n;
 }